home *** CD-ROM | disk | FTP | other *** search
/ Mac Easy 2010 May / Mac Life Ubuntu.iso / casper / filesystem.squashfs / usr / share / pyshared / checkbox / variables.py < prev   
Encoding:
Python Source  |  2009-04-27  |  3.8 KB  |  152 lines

  1. #
  2. # This file is part of Checkbox.
  3. #
  4. # Copyright 2008 Canonical Ltd.
  5. #
  6. # Checkbox is free software: you can redistribute it and/or modify
  7. # it under the terms of the GNU General Public License as published by
  8. # the Free Software Foundation, either version 3 of the License, or
  9. # (at your option) any later version.
  10. #
  11. # Checkbox is distributed in the hope that it will be useful,
  12. # but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  14. # GNU General Public License for more details.
  15. #
  16. # You should have received a copy of the GNU General Public License
  17. # along with Checkbox.  If not, see <http://www.gnu.org/licenses/>.
  18. #
  19. import re
  20. import posixpath
  21.  
  22.  
  23. # Implementation of partial function in Python 2.5+
  24. def VariableFactory(cls, **old_kwargs):
  25.     def variable_factory(**new_kwargs):
  26.         kwargs = old_kwargs.copy()
  27.         kwargs.update(new_kwargs)
  28.         return cls(**kwargs)
  29.  
  30.     return variable_factory
  31.  
  32. try:
  33.     from functools import partial as VariableFactory
  34. except ImportError:
  35.     pass
  36.  
  37.  
  38. class Variable(object):
  39.  
  40.     _value = None
  41.     _required = True
  42.  
  43.     attribute = None
  44.  
  45.     def __init__(self, attribute=None, value=None, value_factory=None,
  46.                  required=True):
  47.         self.attribute = attribute
  48.         self._required = required
  49.         if value is not None:
  50.             self.set(value)
  51.         if value_factory is not None:
  52.             self.set(value_factory())
  53.  
  54.     def get(self, default=None):
  55.         value = self._value
  56.         if value is None:
  57.             return default
  58.         else:
  59.             return self.parse_get(value)
  60.  
  61.     def set(self, value):
  62.         if value is None:
  63.             if self._required is True:
  64.                 raise Exception, "None isn't an acceptable value"
  65.             new_value = None
  66.         else:
  67.             new_value = self.parse_set(value)
  68.  
  69.         self._value = new_value
  70.  
  71.     def parse_get(self, value):
  72.         return value
  73.  
  74.     def parse_set(self, value):
  75.         return str(value)
  76.  
  77.  
  78. class BoolVariable(Variable):
  79.  
  80.     def parse_get(self, value):
  81.         if re.match(r"(yes|true)", value, re.IGNORECASE):
  82.             return True
  83.         elif re.match(r"(no|false)", value, re.IGNORECASE):
  84.             return False
  85.         else:
  86.             return bool(int(value))
  87.  
  88.  
  89. class StringVariable(Variable):
  90.  
  91.     def parse_get(self, value):
  92.         return str(value)
  93.  
  94.  
  95. class PathVariable(StringVariable):
  96.  
  97.     def parse_get(self, value):
  98.         path = super(PathVariable, self).parse_get(value)
  99.         return posixpath.expanduser(path)
  100.  
  101.  
  102. class IntVariable(Variable):
  103.  
  104.     def parse_get(self, value):
  105.         return int(value)
  106.  
  107.  
  108. class FloatVariable(Variable):
  109.  
  110.     def parse_get(self, value):
  111.         return float(value)
  112.  
  113.  
  114. class ListVariable(Variable):
  115.  
  116.     def __init__(self, item_factory, *args, **kwargs):
  117.         super(ListVariable, self).__init__(*args, **kwargs)
  118.         self._item_factory = item_factory
  119.  
  120.     def parse_get(self, value):
  121.         item_factory = self._item_factory
  122.         if not len(value):
  123.             values = []
  124.         else:
  125.             values = re.split(r"\s*,?\s+", value)
  126.  
  127.         return [item_factory(value=v).get() for v in values]
  128.  
  129.     def parse_set(self, value):
  130.         if isinstance(value, list):
  131.             return ", ".join(value)
  132.         else:
  133.             return value
  134.  
  135.  
  136. def get_variable(obj, attribute):
  137.     return get_variables(obj)[attribute]
  138.  
  139. def get_variables(obj):
  140.     from checkbox.attribute import get_attributes
  141.  
  142.     if "__checkbox_variables__" in obj.__dict__:
  143.         return obj.__dict__["__checkbox_variables__"]
  144.     else:
  145.         variables = {}
  146.         cls = type(obj)
  147.         for attribute in get_attributes(cls).itervalues():
  148.             variable = attribute.variable_factory(attribute=attribute)
  149.             variables[attribute] = variable
  150.  
  151.         return obj.__dict__.setdefault("__checkbox_variables__", variables)
  152.